home *** CD-ROM | disk | FTP | other *** search
/ SGI Hot Mix 17 / Hot Mix 17.iso / HM17_SGI / research / lib / write_wave.pro < prev    next >
Text File  |  1997-07-08  |  5KB  |  149 lines

  1. ; $Id: write_wave.pro,v 1.4 1997/01/15 03:11:50 ali Exp $
  2. ;
  3. ; Copyright (c) 1991-1997, Research Systems, Inc.  All rights reserved.
  4. ;    Unauthorized reproduction prohibited.
  5.  
  6. PRO write_wave, filename, data, BIN = BIN, NOMESHDEF = NOMESHDEF, $
  7.         DATANAME = DATANAME, $
  8.         MESHNAME = MESHNAME, $
  9.         VECTOR = VECTOR
  10. ;+
  11. ; NAME:
  12. ;    WRITE_WAVE
  13. ;
  14. ; PURPOSE:
  15. ;    Write a three dimensional IDL array to a .wave or .bwave file
  16. ;    for use with the Wavefront Visualizer.
  17. ;
  18. ; CALLING SEQUENCE:
  19. ;    WRITE_WAVE, File, Array
  20. ;
  21. ; INPUTS:
  22. ;    File:        Scalar string giving the name of the Wavefront file to write.
  23. ;    Array:       3D matrix to be output.
  24. ;
  25. ; KEYWORD PARAMETERS:
  26. ;    BIN:       If the BIN keyword is set, the file will be written in
  27. ;           Binary mode, otherwise, it is written as a text file.
  28. ;    DATANAME:  The name of the data inside of the Wavefront file.  If
  29. ;           not specified, the name used is "idldata".
  30. ;    MESHNAME:  The name of the mesh used in the Wavefront file.  When
  31. ;           not specified, the name used is "idlmesh".
  32. ;    NOMESHDEF: When set, no mesh definition is included.
  33. ;    VECTOR:    When set, the variable being written is written as a 
  34. ;           vector
  35. ;
  36. ; OUTPUTS:
  37. ;    FILE contains the array in Wavefront file format. If DATANAME
  38. ;    was supplied, the scalar data field in the Wavefront file is given
  39. ;    that name. 
  40. ;
  41. ; RESTRICTIONS:
  42. ;    This routine only writes one scalar field for each Wavefront file
  43. ;    that it creates.
  44. ;
  45. ; MODIFICATION HISTORY:
  46. ;    Written July 3, 1991, by Steve Richards.
  47. ;-
  48.  
  49.  
  50. IF NOT(KEYWORD_SET(DATANAME)) THEN DATANAME = "idldata"
  51. IF NOT(KEYWORD_SET(MESHNAME)) THEN MESHNAME = "idlmesh"
  52.  
  53. s = size(data)
  54. IF (KEYWORD_SET(VECTOR) AND (s[1] EQ 3)) THEN vectwrite = 2 $
  55. ELSE vectwrite = 1
  56.  
  57. OPENW, unit, filename, /GET_LUN
  58.  
  59. IF (KEYWORD_SET(BIN)) THEN BEGIN
  60.  
  61.   WRITEU, unit, 257L                    ;new block
  62.   WRITEU, unit, 276L                    ;definevolume
  63.   WRITEU, unit, LONG(STRLEN(DATANAME)), DATANAME
  64.   WRITEU, unit, 277L                    ;definevolume_mesh
  65.   WRITEU, unit, LONG(STRLEN(MESHNAME)), MESHNAME
  66.   WRITEU, unit, 278L                    ;definevolume_vdata
  67.   WRITEU, unit, LONG(STRLEN(DATANAME)), DATANAME
  68.  
  69.   IF (NOT(KEYWORD_SET(NOMESHDEF))) THEN BEGIN
  70.     WRITEU, unit, 257L                    ;newblock
  71.     WRITEU, unit, 273L                    ;definemesh
  72.     WRITEU, unit, LONG(STRLEN(MESHNAME)), MESHNAME
  73.     WRITEU, unit, 274L                    ;definemesh_topology
  74.     WRITEU, unit, 6L, "idltop"
  75.     WRITEU, unit, 275L                    ;definemesh_grid
  76.     WRITEU, unit, 7L, "idlgrid"
  77.   
  78.     WRITEU, unit, 257L                    ;newblock
  79.     WRITEU, unit, 259L                    ;definereg_topology
  80.     WRITEU, unit, 6L, "idltop"
  81.     WRITEU, unit, 260L                    ;defineelem_samp
  82.     WRITEU, unit, (s[vectwrite:s[0]] - 1)
  83.   
  84.     WRITEU, unit, 257L                    ;newblock
  85.     WRITEU, unit, 265L                    ;definereg_grid
  86.     WRITEU, unit, 7L, "idlgrid"
  87.     WRITEU, unit, 266L                    ;definegrid_samp
  88.     WRITEU, unit, s[vectwrite:s[0]]
  89.     WRITEU, unit, 267L                    ;defineorigin
  90.     WRITEU, unit, LONARR(s[0])
  91.     WRITEU, unit, 268L                    ;definestep
  92.     WRITEU, unit, (FLTARR(s[0]) + 1.)
  93.   ENDIF
  94.  
  95.   WRITEU, unit, 257L                    ;newblock
  96.   WRITEU, unit, 258L                    ;definevdata
  97.   WRITEU, unit, 1L
  98.   IF (vectwrite EQ 2) THEN $
  99.     DATANAME = DATANAME + "(3)"
  100.   WRITEU, unit, LONG(STRLEN(DATANAME)), DATANAME
  101.   WRITEU, unit, LONG(N_ELEMENTS(data))
  102.   WRITEU, unit, FLOAT(data)
  103.  
  104. ENDIF ELSE BEGIN                    ;else write text file
  105.  
  106.   PRINTF, unit, ""
  107.   PRINTF, unit, ""
  108.   PRINTF, unit, ""
  109.  
  110.   PRINTF, unit, "define volume " + DATANAME
  111.   PRINTF, unit, "  volume_mesh " + MESHNAME
  112.   PRINTF, unit, "  volume_vdata " + DATANAME
  113.   PRINTF, unit, ""
  114.  
  115.   IF (NOT(KEYWORD_SET(NOMESHDEF))) THEN BEGIN
  116.     PRINTF, unit, "define mesh " + MESHNAME
  117.     PRINTF, unit, "  mesh_topology idltop"
  118.     PRINTF, unit, "  mesh_grid idlgrid"
  119.     PRINTF, unit, ""
  120.   
  121.     PRINTF, unit, "define reg_topology idltop"
  122.     endofline = STRCOMPRESS(s[1:s[0]] - 1)
  123.     PRINTF, unit, "  elem_samp" + $
  124.         STRCOMPRESS(REFORM(BYTE(STRING(s[vectwrite:s[0]] - 1)), 36, /OVER))
  125.     PRINTF, unit, ""
  126.     PRINTF, unit, "define reg_grid idlgrid"
  127.     PRINTF, unit, "  grid_samp" + $
  128.         STRCOMPRESS(REFORM(BYTE(STRING(s[vectwrite:s[0]])), 36, /OVERW))
  129.     PRINTF, unit, "  origin" + $
  130.         STRCOMPRESS(REFORM(BYTE(STRING(lonarr(3))), 36, /OVERW))
  131.     PRINTF, unit, "  step" + $
  132.         STRCOMPRESS(REFORM(BYTE(STRING(fltarr(3) + 1.0)), 39, /OVERW))
  133.     PRINTF, unit, ""
  134.   ENDIF
  135.  
  136.   IF (vectwrite EQ 2) THEN $
  137.     DATANAME = DATANAME + "(3)"
  138.   PRINTF, unit, "define vdata 1 " + DATANAME + STRCOMPRESS(N_ELEMENTS(data))
  139.   PRINTF, unit, ""
  140.   IF (vectwrite EQ 2) THEN $
  141.     PRINTF, unit, data, FORMAT = '(F8.3, F8.3, F8.3)' $
  142.   ELSE PRINTF, unit, data, FORMAT = '(F8.3)'
  143. ENDELSE
  144.  
  145. FREE_LUN, unit
  146.  
  147. END
  148.  
  149.